#include "IteradorRegistrosFijos.h"

IteradorRegistrosFijos::IteradorRegistrosFijos(
		EstrategiaAlmacenamientoRegistro* estrategia) {
	this->estrategia = estrategia;
	this->registroActual = NULL;
	reiniciarIterador();
}

IteradorRegistrosFijos::~IteradorRegistrosFijos() {

	if (this->registroActual != NULL) {
		delete this->registroActual;
	}
}

Bytes IteradorRegistrosFijos::getSiguiente() {

	RegistroFijo* registro = this->registroActual;

	if (registro == NULL) {
		return Bytes("");
	}
	this->offsetActual += this->estrategia->tamanioRegistroSerializado;

	Bytes dato = registro->getDato();
	this->obtenerRegistroSiguiente();

	return dato;

}

bool IteradorRegistrosFijos::tieneSiguiente() {

	return (this->registroActual != NULL);
}

void IteradorRegistrosFijos::obtenerRegistroSiguiente() {

	if (this->registroActual != NULL) {
		delete this->registroActual;
	}

	this->registroActual = NULL;

	offset tamanio = this->estrategia->recurso->getTamanioArchivo();

	if (offsetActual + this->estrategia->tamanioRegistroSerializado > tamanio) {
		return;
	}

	bool encontrado = false;
	RegistroFijo *registro = NULL;

	while (!encontrado) {

		Bytes bytesRegistro = this->estrategia->recurso->leer(offsetActual,
				this->estrategia->tamanioRegistroSerializado);

		if (bytesRegistro.getTamanio() == 0) {
			return;
		}

		registro = new RegistroFijo(bytesRegistro);
		registro->hidratarse(bytesRegistro);

		if (registro->estaVivo()) {
			this->registroActual = registro;
			encontrado = true;
		} else {
			offsetActual += this->estrategia->tamanioRegistroSerializado;
			if (offsetActual + this->estrategia->tamanioRegistroSerializado > tamanio) {
				return;
			}
		}

	}
}

void IteradorRegistrosFijos::reiniciarIterador() {
	this->offsetActual = this->estrategia->tamanioHeaderConPadding;
	this->obtenerRegistroSiguiente();
}

offset IteradorRegistrosFijos::getCantDatos() {
	return estrategia->getCantRegistros();
}
